/*****************************************************************************
 * plum_hal_gpio.h
 *
 * Copyright (C) 2020 Jeasonvor <1101627719@qq.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 ****************************************************************************/

#ifndef __PLUM_HAL_GPIO_H__
#define __PLUM_HAL_GPIO_H__

/*****************************************************************************
 * Included Files
 ****************************************************************************/

/*****************************************************************************
 * Pre-processor Definitions
 ****************************************************************************/

/*****************************************************************************
 * Public Types
 ****************************************************************************/

typedef enum {
    PLUM_HAL_GPIO_MODE_ANALOG,      /** 模拟输入        */
    PLUM_HAL_GPIO_MODE_INPUT,       /** 输入            */
    PLUM_HAL_GPIO_MODE_INPUT_UP,    /** 上拉输入        */
    PLUM_HAL_GPIO_MODE_INPUT_DOWN,  /** 下拉输入        */
    PLUM_HAL_GPIO_MODE_OUT_PP,      /** 推挽输出        */
    PLUM_HAL_GPIO_MODE_OUT_PP_UP,   /** 推挽上拉        */
    PLUM_HAL_GPIO_MODE_OUT_PP_DOWN, /** 推挽下拉        */
    PLUM_HAL_GPIO_MODE_OUT_OD,      /** 开漏输出        */
    PLUM_HAL_GPIO_MODE_OUT_OD_UP,   /** 开漏上拉输出    */
    PLUM_HAL_GPIO_MODE_OUT_OD_DOWN, /** 开漏下拉输出    */
    PLUM_HAL_GPIO_MODE_AF_PP,       /** 推挽复用        */
    PLUM_HAL_GPIO_MODE_AF_OD,       /** 开漏复用        */
    PLUM_HAL_GPIO_MODE_AF_INPUT,    /** 输入复用        */
} plum_hal_gpio_com_cof_t;

typedef enum {
    PLUM_HAL_GPIO_IRQ_FALLING_EDGE, /** 下降沿           */
    PLUM_HAL_GPIO_IRQ_RISING_EDGE,  /** 上升沿           */
    PLUM_HAL_GPIO_IRQ_BOTH_EDGE,    /** 上升沿和下降沿    */
    PLUM_HAL_GPIO_IRQ_HIGH_LEVEL,   /** 高电平           */
    PLUM_HAL_GPIO_IRQ_LOW_LEVEL,    /** 低电平           */
} plum_hal_gpio_irq_t;

typedef struct {
    plum_hal_gpio_irq_t trip;             /** 触发方式 */
    plum_void (*irq_handle)(plum_u32 id); /** 中断处理 */
} plum_hal_gpio_irq_cof_t;

typedef enum {
    PLUM_HAL_GPIO_MODE_IRQ,    /** 中断模式 */
    PLUM_HAL_GPIO_MODE_COMMON, /** 普通模式 */
} plum_hal_gpio_mode_t;

typedef struct {
    plum_hal_gpio_mode_t mode; /* 引脚模式 */
    union {
        plum_hal_gpio_com_cof_t com; /* 普通模式参数 */
        plum_hal_gpio_irq_cof_t irq; /* 中断模式参数 */
    } config;                        /* 引脚配置参数 */
} plum_hal_gpio_cof_t;

typedef enum {
    PLUM_HAL_GPIO_LOW,  /** 低电平 */
    PLUM_HAL_GPIO_HIGH, /** 高电平 */
    PLUM_HAL_GPIO_TOG,  /** 翻转   */
} plum_hal_gpio_sta_t;

/*****************************************************************************
 * Public Data
 ****************************************************************************/

/****************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif

/*****************************************************************************
 * Public Function Prototypes
 ****************************************************************************/

/**
 * @brief： gpio管脚初始化
 *
 * @param[in]:  id      -   GPIO ID,refer@PLUM_HAL_GPIO_ID
 * @param[in]:  cof     -   gpio参数结构体指针
 *
 * @return: 成功    -   返回0
 *          失败    -   返回错误码
 *
 * @note:   gpio中断初始化后默认自动使能中断
 * */
plum_s32 plum_hal_gpio_init(plum_u32 id, plum_hal_gpio_cof_t *cof);

/**
 * @brief： 读GPIO引脚电平
 *
 * @param[in]:  id  -   初始化返回的ID
 *
 * @return: 成功    -   返回电平值，
 * */
plum_bit plum_hal_gpio_read(plum_u32 id);

/**
 * @brief： 写GPIO引脚电平
 *
 * @param[in]:  id  -   初始化返回的ID
 * @param[in]:  sta -   电平状态
 *
 * @return: 成功  -   返回0
 *          失败    -   返回错误码
 * */
plum_s32 plum_hal_gpio_write(plum_u32 id, plum_hal_gpio_sta_t sta);

/**
 * @brief:  使能中断
 *
 * @param[in]:  id      -   GPIO ID
 *
 * @return:
 **/
plum_void plum_hal_gpio_irq_enable(plum_u32 id);

/**
 * @brief:  禁能中断
 *
 * @param[in]:  id      -   GPIO ID
 *
 * @return:
 **/
plum_void plum_hal_gpio_irq_disable(plum_u32 id);

/****************************************************************************/
#ifdef __cplusplus
}
#endif
/****************************************************************************/
#endif /* __PLUM_HAL_GPIO_H__ */
/****************************************************************************/

/****************************************************************************/
/*                                                                          */
/*  End of file.                                                            */
/*                                                                          */
/****************************************************************************/
